package so.sao.shop.supplier.dao;


import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.access.method.P;
import so.sao.shop.supplier.domain.Account;
import so.sao.shop.supplier.domain.CheckingAccountResult;
import so.sao.shop.supplier.domain.Purchase;
import so.sao.shop.supplier.kingdee.input.TradeParameterInput;
import so.sao.shop.supplier.kingdee.output.PurchaseOutput;
import so.sao.shop.supplier.pojo.input.AccountPurchaseInput;
import so.sao.shop.supplier.pojo.input.AccountPurchaseLowInput;
import so.sao.shop.supplier.pojo.input.PurchaseSelectInput;
import so.sao.shop.supplier.pojo.output.OrderCancelReasonOutput;
import so.sao.shop.supplier.pojo.output.PurchaseRefuseOutPut;
import so.sao.shop.supplier.pojo.vo.*;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 订单信息  dao 接口
 * </p>
 *
 * @author 透云-中软-西安项目组
 * @since 2017-07-19
 */
public interface PurchaseDao {
    /**
     * 保存订单信息
     *
     * @param list 订单对象
     * @return
     */
    public int savePurchase(List<Purchase> list) throws Exception;


    /**
     * 根据订单ID获取订单信息.
     *
     * @param orderId
     * @return
     */
    Purchase findById(String orderId);

    /**
     * 查询订单列表
     *
     * @param purchaseInput
     * @return
     */
    List<PurchasesVo> findPage(PurchaseSelectInput purchaseInput);

    /**
     * 更改订单状态
     *
     * @param orderId
     * @param orderStatus
     * @return boolean
     */
    boolean updateOrder(@Param("orderId") String orderId, @Param("orderStatus") Integer orderStatus,@Param("updateDate") Date updateDate);

    /**
     * 发货接口
     *
     * @param orderStatus
     * @param receiveMethod
     * @param name
     * @param number
     * @return boolean
     */
    void deliverGoods(@Param("orderId") String orderId,@Param("orderStatus") Integer orderStatus,@Param("updateDate") Date date,
                      @Param("receiveMethod") Integer receiveMethod, @Param("name") String name, @Param("number") String number) throws Exception;

    /**
     * 删除订单，可批量删除
     *
     * @param orderIdArr
     * @return
     */
    void deleteByOrderId(@Param("orderIdArr") String[] orderIdArr, @Param("updateDate") Date updateDate);

    /**
     * 批量获取订单列表
     * @param accountId 供应商ID
     * @return List<Purchase>
     */
    List<Purchase> getOrderListByIds(@Param("purchaseSelectInput") PurchaseSelectInput purchaseSelectInput,@Param("accountId") Long accountId);

    /**
     * 根据商品ID查询供应商信息
     *
     * @param id 商品ID
     * @return
     */
    Account findAccountById(@Param("id") long id);

    /**
     * 更新订单中账户状态
     *
     * @param recordId 结算明细id
     * @param updateDate 更新时间
     * @return
     */
    int updateAccountStatus(@Param("recordId") String recordId, @Param("updateDate") Date updateDate);

    /**
     * 根据订单表商户ID，查询该表中订单状态为已收货，账户状态为未结算的订单结算金额累计之和,返回和数；
     *
     * @param storeId
     * @return
     */
    BigDecimal findUncountedMoney(@Param("storeId") Long storeId) throws Exception;

    /**
     * 根据商户ID查询订单状态并返回总金额
     *
     * @param storeId
     * @return
     */
    BigDecimal findOrderStatus(@Param("storeId") Long storeId);

    /**
     * 根据商家编号查找所有相关订单记录(高级搜索)
     *
     * @param storeId 商家编号
     * @return 查询的相关记录
     */
    List<AccountPurchaseVo> findPageByStoreId(@Param("input") AccountPurchaseInput input, @Param("storeId") Long storeId);

    /**
     * 根据商家编号查找所有相关订单记录(普通查询)
     *
     * @param storeId 商家编号
     * @return 查询的相关记录
     */
    List<AccountPurchaseVo> findPageByStoreIdLow(@Param("input")AccountPurchaseLowInput input,@Param("storeId") Long storeId);

    /**
     *
     * 获得订单状态
     * @param orderId
     * @return
     */
    Integer getOrderStatus(@Param("orderId") String orderId);

    /**
     * 根据订单编号查询订单打印页面信息
     *
     * @param orderId 订单编号
     * @return 订单页面信息封装的vo
     */
    PurchasePrintVo findPrintOrderInfo(@Param("orderId") String orderId);

    /**
     * 添加拒收货信息
     *
     * @param map 封装了所有拒收相关的信息
     * @return boolean 返回true则为成功，false为失败
     */
    void insertRefuseMessage(@Param("map") Map<String,Object> map) throws Exception;

    /**
     * 添加拒收货信息(图片)
     *
     * @param map 封装了所有拒收相关的信息
     * @param imgList 封装了所有图片相关的信息
     * @return boolean 返回true则为成功，false为失败
     */
    void insertRefuseImg(@Param("map")  Map<String, Object> map,@Param("imgList") List<CommBlobUpload> imgList) throws Exception;
    /**
     * 根据订单ID获取该订单的拒收原因
     *
     * @param orderId 订单ID
     * @return OrderRefuseReasonVo 封装了所有订单拒收原因信息
     */
    OrderRefuseReasonVo findRefuseReasonByOrderId(@Param("orderId") String orderId) throws Exception;
    /**
     * 根据订单ID获取该订单的拒收图片
     *
     * @param orderId 订单ID
     * @return OrderRefuseImageVo 封装了所有订单拒收原因信息
     */
    List<OrderRefuseImageVo> findRefuseImageByOrderId(@Param("orderId") String orderId) throws Exception;

    /**
     * 查询该商户下已完成且按自然月结算的订单列表
     * @param storeId 商户id
     * @param currentDate 当前时间
     * @return
     */
    List<Purchase> findPurchaseMonth(@Param("storeId") Long storeId, @Param("currentDate") Date currentDate);

    /**
     * 查询该商户下已完成且按固定时间段结算的订单列表
     * @param storeId 商户id
     * @param lastSettlementDate 上一次结算时间
     * @param remittanced  结算的时间间隔
     * @return
     */
    List<Purchase> findPurchaseFixedTime(@Param("storeId") Long storeId, @Param("lastSettlementDate") Date lastSettlementDate,  @Param("remittanced") String remittanced);

    /**
     * 添加取消订单信息
     *
     * @param cancelMap 封装了所有取消订单相关的信息
     * @return boolean 返回true则为成功，false为失败
     * @throws Exception
     */
    void insertCancelMessage(@Param("cancelMap") Map<String,Object> cancelMap) throws Exception;

    /**
     * 根据订单编号查询取消订单原因
     *
     * @param orderId 订单编号
     * @return
     */
    OrderCancelReasonOutput findCancelReason(@Param("orderId") String orderId);

    /**
     * 根据支付ID获取订单
     * @param payId 支付ID
     * @return List<Purchase>
     */
    List<Purchase> findByPayId(String payId);

    /**
     * 根据订单编号修改订单编号，退款时间
     *
     * @param refundMap 退款参数
     * @return 修改行
     * @throws Exception 异常
     */
    int refundByOrderId(@Param("refundMap") Map<String,Object> refundMap) throws Exception;

    /**
     * 根据订单状态查询订单ID
     *
     * @param orderStatus 订单状态
     * @return String 订单ID
     * @throws Exception 异常
     */
    List<String> findOrderIdByOrderStatus(@Param("orderStatus") Integer orderStatus) throws Exception;

    /**
     * 批量更新订单的账户状态
     * @param purchaseUpdateList
     */
    void updatePurchasesAccountStatusById(List<Purchase> purchaseUpdateList);

    /**
     * 根据订单编号和用户id查询订单
     *
     * @param orderId 订单编号
     * @param userId 用户id
     * @return 订单列表
     */
    List<Purchase> findPurchaseByUserId(@Param("orderId") String orderId, @Param("userId") String userId);

       /**
     * 根据供应商ID查询各类订单数量
     * @param accountId
     * @return
     */
    @MapKey(value = "order_status")
    Map<Object, Object> countOrderNumByOrderStatus(Long accountId);

    /**
     * 更改物流信息
     *
     * @param map 封装了订单ID，物流公司，物流单号，更新时间
     */
    int updateLogisticInfoByOrderId(@Param("map") Map<String, Object> map);

    /**
     * 根据供应商ID获取时间段内的订单总金额(订单金额+运费),且统计的订单为已完成的
     * @param startTime
     * @param endTime
     * @param accountId
     * @return
     */
    BigDecimal getTotalMoneyByAccountId(@Param("startTime")String startTime,@Param("endTime") String endTime, @Param("accountId")Long accountId);
    /**
     * 根据订单ID集合获取订单详情集合
     *
     * @param orderIds 订单ID集合
     * @return List<PurchaseInfoVo>
     */
    List<PurchaseItemVo> findPurchaseItemByIds(@Param("orderIds") List<String> orderIds);


    /**
     * 金蝶_查询卖家已卖出的交易数据
     * @param tradeParameterInput tradeParameterInput
     * @return List<Purchase>
     */
    List<PurchaseOutput> getTradeList(TradeParameterInput tradeParameterInput);

    /**
     * 金蝶_物流发货更新订单信息
     * @param tid 订单编号
     * @param out_sid 物流单号
     * @param companyName 物流公司
     * @param deliverGoodsTime 发货时间
     */
    void updateOrderInfo(@Param("tid")String tid, @Param("out_sid")String out_sid, @Param("companyName")String companyName, @Param("deliverGoodsTime")Date deliverGoodsTime);

    /**
     * 更新结算金额
     *
     * @param map 封装了入参
     */
    void updateSettlemePrice(@Param("map") Map<String ,Object> map);

    /**
     *将退款信息存入库
     *
     * @param map 封装了入参
     * @return
     */
    boolean insertIntoRefundInfo(@Param("map")Map<String,Object> map);

    /**
     * 更改SKU订单退款信息
     *
     * @param map 入参
     * @return int 出参
     */
    int refundSectionByOrderId(@Param("map") Map<String,Object> map);

    /**
     * 更新退款金额
     * @param drawbackPrice 退款金额
     * @param orderId 订单ID
     */
    void updateDrawbackPrice(@Param("drawbackPrice") BigDecimal drawbackPrice,@Param("orderId") String orderId);

    /**
     * 【v1.2.0】供应商查询拒收已支付已取消详情接口
     * @param orderId 订单ID
     * @return
     */
    PurchaseRefuseOutPut findRefuseOrderDetails(String orderId);

	 /**
     * 更改订单状态为已完成
     * @param orderIds 订单ID集合
     * @param status 订单状态
     * @return
     */
    boolean updateRefundOrderStatus(@Param("orderIds") List<String> orderIds,@Param("status") Integer status,@Param("date") Date date);
    /**
     * 根据订单状态查询订单ID的list
     *
     * @param map 封装了需要查询的订单状态
     * @return List<String> 订单ID的list
     */
    List<PurchasesVo> findOrderIdByStatus(@Param("map") Map<String,Object> map);
    /**
     * 根据时间过滤订单ID
     * @param refundWholeOrderIds 状态筛选后的ID集合
     * @return List<String> 订单ID结合
     */
    List<String> getOrderIdByTime(@Param("refundWholeOrderIds") List<String> refundWholeOrderIds,@Param("nowTime") Date nowTime);
    /**
     * 通过订单ID集合查询回寄物流单号
     * @param orderIds 订单ID集合
     * @param detailIds 详情D集合
     * @return List<OrderRefundLogisticsVo>
     */
    List<OrderRefundLogisticsVo> getRefundOrderLogistics(@Param("orderIds") List<String> orderIds,@Param("detailIds") List<BigInteger> detailIds);

    /**
     * 根据订单状态获取订单列表
     *
     * @param orderStatus 订单状态
     * @return List<PurchasesVo>订单列表
     */
    List<PurchasesVo> getOrderInfoByOrderStatus(@Param("orderStatus") Integer orderStatus);
    /**
     * 【v1.2.0】供应商审核拒收退款申请（同意/拒绝）
     * @param orderId 订单编号
     * @param status 同意/拒绝
     * @param storeRefuseReason 拒绝原因
     * @return
     */
    int updateRefuseOrderStatus(@Param("orderId") String orderId,@Param("status") Integer status,@Param("storeRefuseReason") String storeRefuseReason);

    /**
     * 根据订单状态获取相关订单的全部记录
     * @param status
     * @return
     */
    List<Purchase> getOrderByStatus(Integer status);


    /**
     * 根据入参中的状态及需要修改的子订单编号批量修改子订单状态
     *
     * @param orderIds
     * @param status
     * @return
     */
    int updateOrderStatus(@Param("orderIds") List<String> orderIds, @Param("status") Integer status);

    /**
     * 根据退款号获取订单ID
     * @param returnNum 退款号
     * @return
     */
    String getOrderByReturnNum(@Param("returnNum") String returnNum);

    /**
     * 查找订单未完成的个数
     * @param payId
     * @return
     */
    int findOrdersStatus(@Param("payId")String payId);

    /**
     * 批量更新订单银货两讫状态及核帐时间
     * @param list
     * @param time
     */
    void updateCheck(@Param("list")List<CheckingAccountResult> list,@Param("time") Date time);

    /**
     * 批量更新支付回调记录的状态
     * @param list
     * @param time
     */
    void updatePayInfo(@Param("list")List<CheckingAccountResult> list,@Param("time")Date time);
}